import re

from django import http
from django.contrib.auth import login
from django.db import DatabaseError
from django.shortcuts import render, redirect

# Create your views here.
from django.urls import reverse
# 导入到的路径是app路径  所以进行操作的是以app为相对路径而言的
from users.models import User
from django.views import View



class RegisterView(View):
    """用户注册的视图"""

    """定义和请求方法同名的函数  因为请求是Get方法  所以就可以实现"""

    def get(self, request):
        """提供用户注册界面  render函数进行返回"""
        return render(request, "register.html")


    def post(self, request):
        # 根据设置里面的数据进行操作
        # 接收参数：表单参数  获取前端请求的参数
        username = request.POST.get('username')
        password = request.POST.get('password')
        password2 = request.POST.get('password2')
        mobile = request.POST.get('mobile')
        # allow = request.POST.get('allow')
        # 校验参数：前后端的校验需要分开，避免恶意用户越过前端逻辑发请求，要保证后端的安全，前后端的校验逻辑相同
        # 判断参数是否齐全:all([列表])：会去校验列表中的元素是否为空，只要有一个为空，返回false
        if not all([username, password2, password, mobile]):
            return http.HttpResponseForbidden("缺少比传的参数")
        # 判断用户名是否是8-20个数字
        if not re.match(r'^[a-zA-Z0-9_-]{5,20}$', username):
            return http.HttpResponseForbidden("请输入5-20个字符的用户名")
        # 判断密码密码是否是8位数
        # 判断密码密码是否是8位数
        if not re.match(r'^[0-9A-Za-z]{8,20}$', password):
            return http.HttpResponseForbidden("请输入8-20位的密码")
        # 判断两次的密码是否一致
        if password != password2:
            return http.HttpResponseForbidden("两次密码不一致 请重新输入")
        # 判断手机号是否合法
        if not re.match(r'^1[3-9]\d{9}$', mobile):
            return http.HttpResponseForbidden('请输入正确的手机号码')
        # 判断是否勾选用户协议
        # if allow != 'on':
        #     return http.HttpResponseForbidden('请勾选用户协议')
        # 保存注册数据：是注册业务的核心
        try:
            User.objects.create_user(username=username, password=password, mobile=mobile)
        except DatabaseError:
            # renter实现准发到执行的路径界面
            return render(request, 'register.html', {'register_errmsg': '注册失败'})

        # 实现状态的保持
        # login(request, user)

        # 响应结果：重定向到首页
        # return http.HttpResponse('注册成功，重定向到首页  重定向到contents里面的index')
        # return redirect('/')
        # reverse('contents:index') == '/'  contents是总路由的空间数据  index是子路由的数据
        return redirect(reverse('contents:indexView'))
